#!/usr/bin/env python3
"""
生产环境配置文件
"""

import os
from datetime import timedelta
from config import Config

class ProductionConfig(Config):
    """生产环境配置
    
    重要安全提示：
    1. 必须设置强随机的 SECRET_KEY 和 JWT_SECRET_KEY
    2. 必须关闭 DEBUG 模式
    3. 使用 PostgreSQL 或 MySQL 而非 SQLite
    4. 限制 CORS_ORIGINS 到可信域名
    5. 使用 HTTPS
    """
    
    # 强制关闭调试模式
    DEBUG = False
    TESTING = False
    
    # 必须从环境变量读取密钥，不允许使用默认值
    SECRET_KEY = os.environ.get('SECRET_KEY')
    if not SECRET_KEY or SECRET_KEY == 'dev-secret-key-change-in-production':
        raise ValueError(
            "生产环境必须设置 SECRET_KEY 环境变量！\n"
            "生成方法: python -c \"import secrets; print(secrets.token_hex(32))\""
        )
    
    JWT_SECRET_KEY = os.environ.get('JWT_SECRET_KEY')
    if not JWT_SECRET_KEY or JWT_SECRET_KEY == 'jwt-secret-key-change-in-production':
        raise ValueError(
            "生产环境必须设置 JWT_SECRET_KEY 环境变量！\n"
            "生成方法: python -c \"import secrets; print(secrets.token_hex(32))\""
        )
    
    # 数据库配置
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')
    if not SQLALCHEMY_DATABASE_URI:
        raise ValueError("生产环境必须设置 DATABASE_URL 环境变量！")
    
    # 警告：不建议在生产环境使用 SQLite
    if SQLALCHEMY_DATABASE_URI.startswith('sqlite'):
        print("⚠️  警告：生产环境不建议使用 SQLite 数据库")
        print("   建议使用 PostgreSQL 或 MySQL")
    
    # JWT 配置 - 生产环境可以设置更长的过期时间
    JWT_ACCESS_TOKEN_EXPIRES = timedelta(
        hours=int(os.environ.get('JWT_ACCESS_TOKEN_EXPIRES', 24))
    )
    JWT_REFRESH_TOKEN_EXPIRES = timedelta(
        days=int(os.environ.get('JWT_REFRESH_TOKEN_EXPIRES', 30))
    )
    
    # CORS 配置 - 必须明确指定允许的源
    CORS_ORIGINS = os.environ.get('CORS_ORIGINS', '').split(',')
    if not CORS_ORIGINS or CORS_ORIGINS == ['']:
        raise ValueError(
            "生产环境必须设置 CORS_ORIGINS 环境变量！\n"
            "示例: CORS_ORIGINS=https://yourdomain.com,https://www.yourdomain.com"
        )
    
    # 确保不包含 localhost（除非特别需要）
    if any('localhost' in origin for origin in CORS_ORIGINS):
        print("⚠️  警告：CORS_ORIGINS 包含 localhost，生产环境通常不应包含")
    
    # 日志级别
    LOG_LEVEL = os.environ.get('LOG_LEVEL', 'WARNING')
    
    # 缓存配置
    GITHUB_TRENDING_CACHE_HOURS = int(
        os.environ.get('GITHUB_TRENDING_CACHE_HOURS', 4)
    )
    
    # 会话配置
    SESSION_COOKIE_SECURE = True  # 仅通过 HTTPS 传输 cookie
    SESSION_COOKIE_HTTPONLY = True  # 防止 JavaScript 访问 cookie
    SESSION_COOKIE_SAMESITE = 'Lax'  # CSRF 保护
    
    # 其他安全配置
    PERMANENT_SESSION_LIFETIME = timedelta(days=7)
    
    @classmethod
    def validate(cls):
        """验证配置是否符合生产环境要求"""
        print("\n" + "=" * 60)
        print("生产环境配置验证")
        print("=" * 60)
        
        checks = []
        
        # 检查密钥长度
        if len(cls.SECRET_KEY) < 32:
            checks.append(("❌", "SECRET_KEY 长度过短（建议至少 32 字节）"))
        else:
            checks.append(("✅", "SECRET_KEY 长度合格"))
        
        if len(cls.JWT_SECRET_KEY) < 32:
            checks.append(("❌", "JWT_SECRET_KEY 长度过短（建议至少 32 字节）"))
        else:
            checks.append(("✅", "JWT_SECRET_KEY 长度合格"))
        
        # 检查数据库
        if cls.SQLALCHEMY_DATABASE_URI.startswith('sqlite'):
            checks.append(("⚠️", "使用 SQLite（不建议用于生产环境）"))
        else:
            checks.append(("✅", f"使用生产级数据库"))
        
        # 检查 CORS
        if len(cls.CORS_ORIGINS) > 0:
            checks.append(("✅", f"CORS 配置: {len(cls.CORS_ORIGINS)} 个域名"))
        
        # 检查调试模式
        if cls.DEBUG:
            checks.append(("❌", "DEBUG 模式已启用（必须关闭！）"))
        else:
            checks.append(("✅", "DEBUG 模式已关闭"))
        
        # 打印结果
        for icon, message in checks:
            print(f"{icon} {message}")
        
        print("=" * 60)
        print()
        
        # 如果有错误，抛出异常
        if any(check[0] == "❌" for check in checks):
            raise ValueError("生产环境配置验证失败，请修复上述错误后重试")

# 在导入时进行验证
if os.environ.get('FLASK_ENV') == 'production':
    ProductionConfig.validate()

